package com.zygh.dlqwservice.util;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CodeGenerator {

  /**
   * <p>
   * 读取控制台内容
   * </p>
   */
  public static String scanner( String tip ) {
    Scanner scanner = new Scanner( System.in );
    System.out.println( "请输入" + tip + "：" );
    if ( scanner.hasNext() ) {
      String ipt = scanner.next();
      if ( StringUtils.isNotBlank( ipt ) ){
        return ipt;
      }

    }
    throw new MybatisPlusException( "请输入正确的" + tip + "！" );
  }

  public static void main( String[] args ) {
    // 代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    String projectPath = System.getProperty( "user.dir" );
    gc.setOutputDir( projectPath + "/src/main/java" );
    gc.setAuthor( "lee" );
    gc.setOpen( false );
    gc.setSwagger2( true );
    gc.setIdType( IdType.AUTO );
    mpg.setGlobalConfig( gc );

    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    dsc.setUrl( "jdbc:postgresql://192.168.11.99:5432/postgres" );
    dsc.setDriverName( "org.postgresql.Driver" );
    dsc.setUsername( "postgres" );
    dsc.setPassword( "123456" );
    mpg.setDataSource( dsc );

    // 包配置
    PackageConfig pc = new PackageConfig();
    pc.setParent( "com.zygh.dlqwservice.module" );
    mpg.setPackageInfo( pc );
    // 自定义配置
    InjectionConfig cfg = new InjectionConfig() {
      @Override
      public void initMap() {
        // to do nothing
      }
    };

    // 如果模板引擎是 freemarker
    String templatePath = "/templates/mapper.xml.ftl";

    // 自定义输出配置
    List<FileOutConfig> focList = new ArrayList<>();
    // 自定义配置会被优先输出
    focList.add( new FileOutConfig( templatePath ) {
      @Override
      public String outputFile( TableInfo tableInfo ) {
        // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
        return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
            + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
      }
    } );

    cfg.setFileOutConfigList( focList );
    mpg.setCfg( cfg );

    // 配置模板
    TemplateConfig templateConfig = new TemplateConfig();

    templateConfig.setXml( null );
    mpg.setTemplate( templateConfig );

    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    strategy.setNaming( NamingStrategy.underline_to_camel );
    strategy.setColumnNaming( NamingStrategy.underline_to_camel );
    strategy.setChainModel( true );
    strategy.setEntityLombokModel( true );
    strategy.setRestControllerStyle( true );
    strategy.setInclude( scanner( "表名，多个英文逗号分割" ).split( "," ) );
    strategy.setControllerMappingHyphenStyle( true );
    mpg.setStrategy( strategy );
    mpg.setTemplateEngine( new FreemarkerTemplateEngine() );
    mpg.execute();
  }

}
